--- id: TASK-013 title: Full-text vault search status: "\U0001F3C1 Done" assignee: [] created_date: '2026-06-29 16:26' updated_date: '2026-06-30 05:07' labels: - feature - release-1 dependencies: [] priority: medium ordinal: 13000 --- ## Description Release 2. The picker matches filenames only. Add a content search across the vault/working dir (ripgrep if available, else a Go walk) surfacing files + matching lines; open at the match. Was explicitly deferred in v1.1. ## Acceptance Criteria - [x] #1 Search note contents across the vault; results show file + matching line - [x] #2 Selecting a result opens the file at the match ## Implementation Plan 1. search.go: contentSearch(root,query) → ripgrep (rg -g *.md, exit-1=empty) with goWalkSearch fallback; SearchHit{Path,Line,Text}; cap maxHits. 2. picker: result type {path,line,text}; '/'-prefixed query runs content search, else filename fuzzy; Selected()/SelectedLine(); listView shows relpath:line text. 3. app: Enter on a content hit Loads then GotoLine(ln). 4. README+help document '/query' content search. 5. TDD throughout. ## Implementation Notes search.go (rg with go-walk fallback, SearchHit, maxHits cap); picker '/'-prefix runs contentSearch, result{path,line,text}, Selected()/SelectedLine(), rowLabel shows file:line text; app Enter GotoLine on a hit; README+help document /query. 7 tests, all green.